package com.hx.utils;//package com.hx.utils;
//
//import fr.opensagres.poi.xwpf.converter.core.utils.StringUtils;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.collections4.CollectionUtils;
//import org.apache.poi.util.Units;
//import org.apache.poi.xwpf.usermodel.*;
//import org.jsoup.Jsoup;
//import org.jsoup.nodes.Document;
//import org.jsoup.nodes.Element;
//import org.jsoup.nodes.Node;
//import org.jsoup.select.Elements;
//import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcBorders;
//import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
//import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder;
//
//import java.io.*;
//import java.math.BigInteger;
//import java.nio.file.Files;
//import java.nio.file.Paths;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Objects;
//import java.util.function.Predicate;
//import java.util.stream.Collectors;
//
//import static com.hx.utils.Html2WordUtils.parseHtmlToWordTable;
//
//@Slf4j
//public class Html2Word {
//    public static void main(String[] args) throws Exception {
//
//        String srcPath = "D:\\work\\project\\jar\\wordtopdf-server\\createWordBytemplate\\src\\test\\java\\template.docx";
//        String htmlPath = "D:\\work\\project\\jar\\wordtopdf-server\\createWordBytemplate\\src\\test\\java\\table.html";
//
//        String filePathPre = "D:\\work\\project\\jar\\wordtopdf-server\\createWordBytemplate\\src\\test\\java\\";
//        Document htmlDocument = Jsoup.parse(new File(htmlPath));
//        List<Node> nodeList = htmlDocument.body().childNodes();
//        List<Node> table = nodeList.stream().filter(new Predicate<Node>() {
//            @Override
//            public boolean test(Node node) {
//                if (node.nodeName().equalsIgnoreCase("table")) {
//                    return true;
//                }
//                return false;
//            }
//        }).collect(Collectors.toList());
//        XWPFDocument doc = new XWPFDocument(new FileInputStream(srcPath));
//        for (Node node : table) {
//            List<Node> nodes = node.childNodes();
//            //处理table标签
//            if ("table".equalsIgnoreCase(node.nodeName())) {
//                parseTableToWord(doc, node, filePathPre);
//                return;
//            }
//        }
//        String outPath = "D:\\work\\project\\jar\\wordtopdf-server\\createWordBytemplate\\src\\test\\java\\out.docx";
//        FileOutputStream outStream = null;
//        outStream = new FileOutputStream(outPath);
//        doc.write(outStream);
//        log.info("输出文件成功！");
//        outStream.close();
//
//    }
//
//    private static void parseTableToWord(XWPFDocument doc, Node node, String filePathPre) throws Exception {
//        //简化表格html
//        String string = node.toString();
//        org.jsoup.nodes.Document tableDoc = Jsoup.parse(Objects.requireNonNull(simplifyTable(string)));
//        Elements trList = tableDoc.getElementsByTag("tr");
//
//        // 获取页边距
//        BigInteger right = (BigInteger) doc.getDocument().getBody().getSectPr().getPgMar().getRight();
//        BigInteger left = (BigInteger) doc.getDocument().getBody().getSectPr().getPgMar().getLeft();
//        // word 工作区域范围宽度
//        double wordWorkAreaWidth = 21 - ((double) (right.intValue() + left.intValue()) / 567);
//
//        //创建表格
//        XWPFParagraph paragraph = doc.createParagraph();
//        XWPFTable oldTable = doc.insertNewTbl(paragraph.getCTP().newCursor());
//        if (null == oldTable) {
//            return;
//        }
//        //设置样式
//        oldTable.setWidth(100);
//
//        //写入表格行和列内容
//        for (int row = 0; row < trList.size(); row++) {
//            XWPFTableRow oldTableRow = oldTable.getRow(row);
//            if (null == oldTableRow) {
//                oldTableRow = oldTable.createRow();
//            }
//            Element trElement = trList.get(row);
//            Elements ths = trElement.getElementsByTag("th");
//
//
//            double widthTotal = 0.0;
//
//            for (int col = 0; col < ths.size(); col++) {
//                XWPFTableRow roww = oldTable.getRow(row);
//                //获取到表头名称
//                String text = ths.get(col).text();
//                int count = oldTable.getNumberOfRows();
//                for (int i = 0; i < count; i++) {
//                    XWPFTableRow r = oldTable.getRow(i);    //表格每行的内容
//                    List<XWPFTableCell> cells = r.getTableCells();   //每个单元格的内容
//                    //遍历表格的每行单元格对象
//                    for (int j = 0; j < cells.size(); j++) {
//                        XWPFTableCell cell = cells.get(j);    //获取每个单元格的内容
//                        String text1 = cell.getText();
//                        List<XWPFParagraph> paragraphs = cell.getParagraphs();      //获取单元格里所有的段落
//                        for (XWPFParagraph p : paragraphs) {
//                            //获取段落的内容
//                            List<XWPFRun> run = paragraph.getRuns();
//                            // 遍历段落文字对象
//                            for (int o = 0; o < run.size(); o++) {
//                                // 获取段落对象
//                                run.get(o).setText(ths.get(col).text(), 0);
//                            }
//                        }
//                    }
//                }
//
//                Element colElement = ths.get(col);
//                List<Node> nodes = colElement.childNodes();
//                for (Node tdNode : nodes) {
//                    if ("img".equalsIgnoreCase(tdNode.nodeName())) {
//                        String width = tdNode.attr("width");
//                        if (StringUtils.isEmpty(width.trim())) {
//                            widthTotal = widthTotal + Double.parseDouble(width.trim());
//                        }
//                    }
//                }
//            }
//            Elements tds = trElement.getElementsByTag("td");
//
//            for (int col = 0; col < tds.size(); col++) {
//
//                Element colElement = tds.get(col);
//                List<Node> nodes = colElement.childNodes();
//                for (Node tdNode : nodes) {
//                    if ("img".equalsIgnoreCase(tdNode.nodeName())) {
//                        String width = tdNode.attr("width");
//                        if (StringUtils.isEmpty(width.trim())) {
//                            widthTotal = widthTotal + Double.parseDouble(width.trim());
//                        }
//                    }
//                }
//            }
//
//            for (int col = 0; col < tds.size(); col++) {
//
//                XWPFTableCell tableCell = oldTableRow.getCell(col);
//                if (null == tableCell) {
//                    tableCell = oldTableRow.createCell();
//                }
//                CTTcPr tcPr = tableCell.getCTTc().isSetTcPr() ? tableCell.getCTTc().getTcPr() : tableCell.getCTTc().addNewTcPr();
//                CTTcBorders ctTcBorders = tcPr.addNewTcBorders();
//                ctTcBorders.addNewLeft().setVal(STBorder.NIL);
//                ctTcBorders.addNewRight().setVal(STBorder.NIL);
//                ctTcBorders.addNewTop().setVal(STBorder.NIL);
//                ctTcBorders.addNewBottom().setVal(STBorder.NIL);
//
//                Element colElement = tds.get(col);
//                List<Node> nodes = colElement.childNodes();
//
//                for (Node tdNode : nodes) {
//                    if ("img".equalsIgnoreCase(tdNode.nodeName())) {
//                        String src = tdNode.attr("src");
//                        String width = tdNode.attr("width");
//                        String height = tdNode.attr("height");
//                        src = src.replaceAll("%20", " ").replaceAll("%26", "&");
//
//                        String picturePath = filePathPre + src;
//
//                        InputStream inputStream = Files.newInputStream(Paths.get(picturePath));
//                        XWPFRun xwpfRun = tableCell.getParagraphs().get(0).createRun();
//
//                        double picWidth = wordWorkAreaWidth * (Double.parseDouble(width.trim()) / widthTotal);
//                        double picHeight = picWidth * Double.parseDouble(height.trim()) / Double.parseDouble(width.trim());
//
//                        xwpfRun.addPicture(inputStream, org.apache.poi.xwpf.usermodel.Document.PICTURE_TYPE_PNG, src,
//                                (int) (picWidth * Units.EMU_PER_CENTIMETER), (int) (picHeight * Units.EMU_PER_CENTIMETER));
//                    } else if ("#text".equalsIgnoreCase(tdNode.nodeName())) {
//                        parseHtmlToWordTable(colElement, doc, tableCell.getParagraphs().get(0));
//                    }
//                }
//            }
//        }
//    }
//
//    public static String simplifyTable(String tableContent) {
//        if (StringUtils.isEmpty(tableContent)) {
//            return null;
//        }
//        org.jsoup.nodes.Document tableDoc = Jsoup.parse(tableContent);
//        Elements trElements = tableDoc.getElementsByTag("tr");
//        // 针对于colspan操作
//        for (Element trElement : trElements) {
//            //去除所有样式
//            trElement.removeAttr("class");
//            Elements tdElements = trElement.getElementsByTag("td");
//            List<Element> tdEleList = covertElements2List(tdElements);
//            for (Element curTdElement : tdEleList) {
//                //去除所有样式
//                curTdElement.removeAttr("class");
//                Element ele = curTdElement.clone();
//                String colspanValStr = curTdElement.attr("colspan");
//                if (!StringUtils.isEmpty(colspanValStr)) {
//                    ele.removeAttr("colspan");
//                    int colspanVal = Integer.parseInt(colspanValStr);
//                    for (int k = 0; k < colspanVal - 1; k++) {
//                        curTdElement.after(ele.outerHtml());
//                    }
//                }
//            }
//        }
//        // 针对于rowspan操作
//        List<Element> trEleList = covertElements2List(trElements);
//        Element firstTrEle = trElements.first();
//        if (null == firstTrEle) {
//            return "";
//        }
//        Elements tdElements = firstTrEle.getElementsByTag("td");
//        Integer tdCount = tdElements.size();
//        //获取该列下所有单元格
//        for (int i = 0; i < tdElements.size(); i++) {
//            for (Element trElement : trEleList) {
//                List<Element> tdElementList = covertElements2List(trElement.getElementsByTag("td"));
//                Node curTdNode = tdElementList.get(i);
//                Node cNode = curTdNode.clone();
//                String rowspanValStr = curTdNode.attr("rowspan");
//                if (!StringUtils.isEmpty(rowspanValStr)) {
//                    cNode.removeAttr("rowspan");
//                    Element nextTrElement = trElement.nextElementSibling();
//                    int rowspanVal = Integer.parseInt(rowspanValStr);
//                    for (int j = 0; j < rowspanVal - 1; j++) {
//                        Node tempNode = cNode.clone();
//                        List<Node> nodeList = new ArrayList<Node>();
//                        nodeList.add(tempNode);
//                        if (j > 0 && null != nextTrElement) {
//                            nextTrElement = nextTrElement.nextElementSibling();
//                        }
//                        Integer indexNum = i + 1;
//                        if (i == 0) {
//                            indexNum = 0;
//                        }
//                        if (null != nextTrElement) {
//                            if (indexNum.equals(tdCount)) {
//                                nextTrElement.appendChild(tempNode);
//                            } else {
//                                nextTrElement.insertChildren(indexNum, nodeList);
//                            }
//                        }
//                    }
//                }
//            }
//        }
//        Element tableEle = tableDoc.getElementsByTag("table").first();
//        if (null == tableEle) {
//            return "";
//        }
//        return tableEle.outerHtml();
//    }
//
//    private static List<Element> covertElements2List(Elements curElements) {
//        return new ArrayList<>(curElements);
//    }
//
//   /* public static void main(String[] args) throws Exception {
//
//        String html2WordTemplatePath = "D:\\work\\project\\jar\\wordtopdf-server\\createWordBytemplate\\src\\test\\java\\template.docx";
//        String htmlPath = "D:\\work\\project\\jar\\wordtopdf-server\\createWordBytemplate\\src\\test\\java\\table.html";
//        Document htmlDocument = Jsoup.parse(new File(htmlPath));
//        XWPFDocument document = new XWPFDocument(Files.newInputStream(Paths.get(html2WordTemplatePath)));
//
// boolean[] returnFlag = {false};
//            String filePathPre = "D:\\work\\project\\jar\\wordtopdf-server\\createWordBytemplate\\src\\test\\java\\";
//
//        List<Node> nodes = htmlDocument.body().childNodes();
//        for (Node node : nodes) {
//            if (!(node instanceof Element)){
//                continue;
//            }
//            if (StringUtils.isEmpty(node.toString().trim())){
//                continue;
//            }
//
//            XWPFParagraph paragraph;
//            if (node.nodeName().equalsIgnoreCase("table") || node.nodeName().equalsIgnoreCase("ul") || node.nodeName().equalsIgnoreCase("span")){
//                paragraph = document.getLastParagraph();
//            }else {
//                paragraph = document.createParagraph();
//            }
//            if (node.nodeName().equalsIgnoreCase("span")){
//                paragraph.setSpacingAfter(200);
//                continue;
//            }
//            Html2WordUtils.parseHtmlToWord(node,document,paragraph,returnFlag,filePathPre);
//            if (returnFlag[0]){
//                break;
//            }
//        }
//        document.getLastParagraph().createRun().addBreak(BreakType.PAGE);
//
//        // 写入到输出流
//        String outPath = "D:\\work\\project\\jar\\wordtopdf-server\\createWordBytemplate\\src\\test\\java" + System.currentTimeMillis() + ".docx";
//        OutputStream outputStream1 = Files.newOutputStream(Paths.get(outPath));
//        document.write(outputStream1);
//        outputStream1.close();
//
//    }*/
//
//}